# @Time : 2020/7/11 14:52
# @Author : Fioman 
# @Phone : 13149920693
"""
鸭子类型: 忽略对象的真正类型,转而关注对象有没有实现所需的方法,签名和语义.
对Python来说,这基本上就是指避免使用isinstance检查对象的类型(更别提type(foo) is bar这种更糟的检查方式了,这样做没任何好处,甚至
禁止最简单的继承方式)
总的来说,鸭子类型在很多情况下十分有用;但是在其他情况下,随着发展,通常更好的方式.事情是这样的.........
然而,平行进化往往导致不相关的种产生相似的特征,形态和举止方面都是如此,但是生态位的相似性是偶然的,不同的种仍属不同的生态位.变成语言中也有这种
"偶然的相似性",比如说下述经典的面向对象编程示例:
"""


class Artist:
    def draw(self):
        pass


class Gunslinger:
    def draw(self):
        pass


class Lottery:
    def draw(self):
        pass

# 只要实现了__len__方法,就被认为是abc.Sized的类型.
class Struggle:
    def __len__(self):
        return 23

from collections import abc
print(isinstance(Struggle(),abc.Sized))

"""
可以看出来,无需注册,abc.Sized也能把Struggle识别为自己的子类,只要实现了特殊方法__len__即可.(要使用正确的句法和语义实现,
前者要求没有参数,后者要求返回一个非负整数,指明对象的长度;如果不使用规定的句法和语义实现特殊方法,如__len__,会导致非常严重的问题.)
检查一个对象是不是序列可以这么做.
isinstance(the_arg,collections.abc.Sequence)

"""



